<?php

namespace app\index\controller;

use think\Request;
use app\common\model\Type;
use app\index\BaseController;
use app\common\services\TypeConsistent;
use app\common\model\Question;

class Types extends BaseController
{
    const DEFAULT_MAX_LEVEL = 2;
    /**
     * 获取所有的题目类型
     *
     * @return \think\Response
     */
    public function getAllTypes()
    {
        return json(
            Type::where(1)->select()
        );
    }

    /**
     * 创建新题目类型
     *
     * @param  \think\Request  $request
     * @return \think\Response
     * @args type_name 类型名称
     * @args parent_type_id 父类型ID，0表示根类型
     * @args output_code? 输出编号
     */
    public function createType()
    {
        // 使用默认验证验证参数有效性
        $this->validateOrError();

        $type_name = input('type_name');
        $parent_type_id = input('parent_type_id');
        $output_code = input('output_code');
        $parent_type_id = intval($parent_type_id);
        $output_code = $output_code === null ? null : intval($output_code);

        // 创建实例
        $type = new Type([
            'type_name' => $type_name,
            'parent_type_id' => $parent_type_id,
        ]);
        // 调整output_code和root_type_id
        $max_output_code = Type::where(1)->max('output_code');
        if ($parent_type_id === 0) {
            $type->output_code = $max_output_code ? $max_output_code + 1 : 0;
            $type->save();
            $type->root_type_id = $type->id;
            $type->save();
        } else {
            $parentType = $type->parent_type;
            if ($parentType) {
                $type->root_type_id = $parentType->root_type_id;
                $type->output_code = $parentType->output_code;
                $type->save();
            } else {
                error('父类型不存在');
            }
        }

        // 返回响应
        return json([
            'message' => '创建类型成功'
        ]);
    }

    /**
     * 编辑题目类型
     *
     * @param  \think\Request  $request
     * @return \think\Response
     * @args id 类型ID
     * @args type_name 类型名称
     * @args parent_type_id 父类型ID，0表示根类型
     * @args output_code? 输出编号
     */
    public function editType($id)
    {
        // 使用默认验证验证参数有效性
        $this->validateOrError();

        $type_name = input('type_name');
        $parent_type_id = input('parent_type_id');
        $output_code = input('output_code');
        $parent_type_id = intval($parent_type_id);
        $output_code = $output_code === null ? null : intval($output_code);

        // 检查类型存在
        $type = Type::where('id', $id)->find();
        if (!$type) {
            error('类型不存在');
        }

        // 更新数据
        if ($type_name !== null) $type->type_name = $type_name;
        if ($parent_type_id !== null) $type->parent_type_id = $parent_type_id;
        if ($output_code !== null) $type->output_code = $output_code;

        $type->save();

        // 返回响应
        return json([
            'message' => '更新类型成功'
        ]);
    }

    /**
     * 删除题目类型
     *
     * @param  int  $id
     * @return \think\Response
     * @args id 类型ID
     */
    public function removeType($id)
    {
        // 检查用户是否存在
        $type = Type::where('id', $id)->find();
        if (!$type) {
            error('类型不存在');
        }

        // 检查是否有题目
        $n = Question::where('type_id', $type->id)->count();
        if ($n > 0) {
            error('该类型下面还有题目，不能删除该类型');
        }

        // 删除
        $type->delete();

        // 返回响应
        return json([
            'message' => '删除成功'
        ]);
    }

    /**
     * 题目类型一致性检查
     *
     * @return \think\Response
     * @args max_level? 类型树最大高度，默认2
     */
    public function checkConsistent()
    {
        $max_level = intval(input('max_level', self::DEFAULT_MAX_LEVEL));

        $types = Type::where(1)->select();
        $consistent = new TypeConsistent($types);
        $result = $consistent->checkConsistent($max_level);

        if (!$result['result']) {
            error($result['message']);
        }

        return json([
            'result' => $result['valid'],
            'message' => $result['message'],
        ]);
    }

    /**
     * 题目类型一致性修复
     *
     * @return \think\Response
     * @args max_level? 类型树最大高度，默认2
     */
    public function fixConsistent()
    {
        $max_level = intval(input('max_level', self::DEFAULT_MAX_LEVEL));

        $types = Type::where(1)->select();
        $consistent = new TypeConsistent($types);
        $result = $consistent->checkConsistent($max_level);

        if ($result['result']) {
            if ($result['valid']) {
                return json([
                    'message' => '题目类型树无需修复'
                ]);
            } else {
                // 执行修复
                db()->transaction(function () use ($consistent) {
                    $consistent->fixConsistent();
                });

                return json([
                    'message' => '题目类型树修复完毕'
                ]);
            }
        } else {
            error('题目类型树无效：' . $result['message']);
        }
    }
}
